﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Design
{

    /// <summary>
    /// 工厂方法模式
    /// </summary>

    
    public interface ICreate
    {
        void Create();
    }

    //#region
    
    /////// <summary>
    /////// 如果它的一部分功能对于子类是公用的，相同的，那我们需要将ICreate设计成抽象类abstract class ,代码可以是这样
    /////// </summary>
    //public abstract class ICreate
    //{

    //    protected string CreateName {
    //        get {
    //            return "一个工厂方法模式";
    //        }
    //    }

    //    public abstract void Create();
    //}
    //#endregion

    //#region  方式一：定义接口创建对象的接口，类集成接口创建对象（方式二 通过接口参数进行了优化）

    
    //public interface CreateFactory
    //{
    //    ICreate CreateObject();
    //}

    //public class PeopleFactory : CreateFactory
    //{
    //    public ICreate CreateObject()
    //    {
    //        return new People();
    //    }
    //}
    //#endregion
    

    /// <summary>
    /// 方式二： 对上面PeopleFactory 进行优化已实现传入接口参数 实例化对象
    /// </summary>
    public class CreateFactory 
    {
        ICreate factory = null;
        public CreateFactory(ICreate obj)
        {
            factory = obj;
        }
    }

    public class People : ICreate
    {
        #region
        public void Create()
        {
            Console.WriteLine("创建人类"); 
        }
        #endregion
    }
}
